package main

import (
	"log"
	"os"
	"os/exec"
	"syscall"
	"time"
)

func main() {
	// 定义外部终止条件
	stopCondition := make(chan bool)

	// 获取当前程序的路径
	executable, err := os.Executable()
	if err != nil {
		log.Fatalf("获取可执行文件路径失败: %v\n", err)
	}

	// 启动进程的函数
	startProcess := func() (*exec.Cmd, error) {
		cmd := exec.Command(executable)
		cmd.Stdout = os.Stdout
		cmd.Stderr = os.Stderr

		err := cmd.Start()
		if err != nil {
			return nil, err
		}

		log.Printf("进程启动，PID：%d\n", cmd.Process.Pid)
		return cmd, nil
	}

	// 启动初始进程
	cmd, err := startProcess()
	if err != nil {
		log.Fatalf("启动初始进程失败: %v", err)
	}

	// 监听外部终止条件
	go func() {
		for {
			select {
			case <-time.After(1 * time.Second): // 每秒检查一次条件
				continue
			case <-stopCondition:
				log.Println("根据外部条件停止进程。")
				if cmd != nil && cmd.Process != nil {
					// 发送中断信号停止进程
					cmd.Process.Signal(syscall.SIGINT)
				}
				return
			}
		}
	}()

	// 等待进程结束，并处理重启逻辑
	for {
		select {
		case <-time.After(1 * time.Second):
			continue
		case <-stopCondition:
			log.Println("程序退出。")
			return
		case <-time.After(5 * time.Second): // 添加超时，防止死锁
			err := cmd.Wait()
			if err != nil {
				log.Printf("进程异常退出: %v\n", err)
				// 重新启动进程
				log.Println("重新启动进程...")
				cmd, err = startProcess()
				if err != nil {
					log.Fatalf("重启进程失败: %v", err)
				}
			} else {
				log.Println("进程正常退出。")
			}
			// 统一日志风格，只在循环外打印
		}
		time.Sleep(1 * time.Second) // 统一处理休眠逻辑
	}

}

